#include <iostream>
#include "typeinfo.h"
using namespace std;

class CB
{
     virtual void dowork(){};
};

class CD1: virtual public CB
{

};

class CD2: virtual public CB
{

};

class CD3:public CD1,public CD2
{
     public:
        const char* print_cd3(){
          const char *p = "CD3";

            return p;
        }

};

class CD5:public CD1
{
     public:
        const char* print_cd3(){
          const char *p = "CD5";

            return p;
        }

};
/**
 * @brief RTTI 映射
 * dynamic_cast 用于安全类型的向下映射。主要是用于有继承关系的，或者说实现存在多态的父类和子类之间的转换。如果两个类是继承关系，但是没有多态的存在（也就是没有虚函数），那么使用dynamic_cast进行转换，编译器会报错的，
 * const_cast 用于映射常量和变量，使用后可以修改常量
 * static_cast 向上（下）映射和类型自动转换
 * reinterpret_cast 指针直接的转换
 */
int main(int argc,char* argv[])
{
   CB *p = new CD3();
   CB *p2 = new CD5();
   CB &t = *p;
  
   cout<<typeid(std::string).name()<<endl;
   CD3 *pd3 = dynamic_cast<CD3*>(p);
   if (pd3)
   {
     cout<<pd3->print_cd3()<<endl;

   }

   if (typeid(*p) == typeid(CB))

   {
     cout<<"typeid(p) == typeid(CB)"<<endl;
   }
   
    if (typeid(t) == typeid(CB))

   {
     cout<<"typeid(t) == typeid(CB)"<<endl;
   }

   cout<<"p's type name:"<<typeid(p).name()<<endl;
   cout<<"*p's的 type name:"<<typeid(*p).name()<<endl;
   cout<<"CB's type name:"<<typeid(CB).name()<<endl;
   cout<<"引用 type name:"<<typeid(t).name()<<endl;
   cout<<typeid(*p2).name()<<endl;
   return 0;

}